热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对象|字典|json|yaml|字符串相互转化

在研究k8s的yaml配置文件的时候,我总担心自己一不小心会写错,所以我向往使用将对象序列化yaml的形式,其实pythonobject

在研究 k8s 的yaml 配置文件的时候,我总担心自己一不小心 会写错,所以我向往 使用将对象 序列化 yaml 的形式,

其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!

这里 会经常用到几个 函数 vars() ast.

import ast
dict_str='****'
real_dict=ast.literal_eval(dict_str)
## 可以处理 键没有 引号 或者键是单引号, json 转dict ,只能处理 键是双引号的

我们先尝试用最笨的方法 实现 object到yaml 的转化
在python对象 convert to dict 的形式,使用 vars()函数

然后 dict convert to json 使用 json.dumps(dict)函数

然后 json converte to yaml 使用 ya= yaml.load(json.dumps(dict)) 然后
再 yaml.safe_dump(ya,default_flow_style=False)

至此我们看到 从 python Object ---> dict ----> json ---> yaml 的转化

其中 obj dict json yaml 转 string ,只要 str()函数即可,或者 str(vars())结合

yaml 格式 写入到文件 ,需要注意的是, open()函数 的mode 一定要是 'w' ,不能是’wb', b代表是二进制写入
yaml 写入的是dict str,使用 ‘wb' 会报错,[yaml TypeError: a bytes-like object is required, not 'str']
【出现该错误往往是通过open()函数打开文本文件时,使用了‘rb’属性,如:fileHandle=open(filename,'rb'),则此时是通过二进制方式打开文件的,所以在后面处理时如果使用了str()函数,就会出现该错误,该错误不会再python2中出现。

具体解决方法有以下两种:

第一种,在open()函数中使用‘r’属性,即文本方式读取,而不是‘rb’,以二进制文件方式读取,可以直接解决问题。

第二种,在open()函数中使用‘rb’,可以在使用之前进行转换,有以下实例,来自:http://stackoverflow.com/questions/33054527/python-3-5-typeerror-a-bytes-like-object-is-required-not-str】

import yamlimport jsonobjdict=vars(Ojbect.instance)data=json.dumps(objdict)ya=yaml.load(data)filey='/Users/geo/Documents/etl_ml/etl_ml/data/demos.yaml'stream = open(filey, 'w')yaml.safe_dump(ya,stream,default_flow_style=False)

其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!
比如我已经定义了一个 Dog python class,他有 好几个属性 并已经赋值初始化了

import json
import yamlclass Dag:def __init__(self):self.apiVersion="apps/v1beta1"self.kind='Deployment'wifi_arr=['geo','tmtl','father']self.metadata=wifi_arrports_Arr=[{'containerPort':8080}]self.ports=ports_Arrdic={'app': {"containers": [{"name": "springboot-demo","image": "springboot-demo","imagePullPolicy": "IfNotPresent","ports": [{"containerPort": 8080}]}]}}#print(str(dic))self.di=dicmeta_Dict={'name':'springboot-demo-deployment','labels':dic}self.metadata=meta_Dict

另外生成 yaml 对象


if __name__ == '__main__':da=Dag()
###yaml_format=yaml.safe_dump(da.__dict__,default_flow_style=False)print( yaml_format)

生成yaml文件

if __name__ == '__main__':dog=Dag()file = 'data/demo.yaml'stream = open(file, 'w')
###重点!!! 生成 yaml 文件yaml.safe_dump(dog.__dict__, stream=stream,default_flow_style=False)

结果是

apiVersion: apps/v1beta1
di: &id001app:containers:- image: springboot-demoimagePullPolicy: IfNotPresentname: springboot-demoports:- containerPort: 8080
kind: Deployment
metadata:labels: *id001name: springboot-demo-deployment
ports:
- containerPort: 8080

反过来 yaml ----> json ---> 持久化 json 文件 indent=1属性是为了让 json 不以单行展示,而是展开
注意的是 python 的 dict 和set 很相似 ,都是 { }, set 里是list, dict 是键值对
【# set object is not JSON serializable [duplicate]

yaml_file = yaml.load(data)json_file='/data/demo.json'json_file2='/data/demo2.json'#json持久化 1with open(json_file,'w') as fp:fp.write(json.dumps(yaml_file,indent=1))# json持久化 2with open(json_file2, 'w') as fp:json.dump(yaml_file, fp,indent=1)

打开 demo.json

{"apiVersion": "apps/v1beta1","kind": "Deployment","metadata": {"name": "springboot-demo-deployment","labels": {"app": {"containers": [{"name": "springboot-demo","image": "springboot-demo","imagePullPolicy": "IfNotPresent","ports": [{"containerPort": 8080}]}]}}},"ports": [{"containerPort": 8080}],"di": {"app": {"containers": [{"name": "springboot-demo","image": "springboot-demo","imagePullPolicy": "IfNotPresent","ports": [{"containerPort": 8080}]}]}}
}

对象 转 json

import jsondef obj_to_json():stu = Student('007', '007', 28, 'male', '13000000000', '123@qq.com')print(type(stu)) # stu = stu.__dict__ # 将对象转成dict字典print(type(stu)) # print(stu) # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}j = json.dumps(obj=stu)print(j) # {"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}if __name__ == '__main__':obj_to_json()

Python之dict(或对象)与json之间的互相转化
在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作。

在Python中自带json库。通过import json导入。在json模块有2个方法,loads():将json数据转化成dict数据
dumps():将dict数据转化成json数据
load():读取json文件数据,转成dict数据
dump():将dict数据转化成json数据后写入json文件
下面是具体的示例:

dict字典转json数据

import jsondef dict_to_json():dict = {}dict['name'] = 'many'dict['age'] = 10dict['sex'] = 'male'print(dict) # 输出:{'name': 'many', 'age': 10, 'sex': 'male'}j = json.dumps(dict)print(j) # 输出:{"name": "many", "age": 10, "sex": "male"}if __name__ == '__main__':dict_to_json()

对象转json数据

import jsondef obj_to_json():stu = Student('007', '007', 28, 'male', '13000000000', '123@qq.com')print(type(stu)) # stu = stu.__dict__ # 将对象转成dict字典print(type(stu)) # print(stu) # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}j = json.dumps(obj=stu)print(j) # {"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}if __name__ == '__main__':obj_to_json()

json数据转成dict字典

import jsondef json_to_dict():j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'dict = json.loads(s=j)print(dict) # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}if __name__ == '__main__':json_to_dict()

json数据转成对象

import jsondef json_to_obj():j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'dict = json.loads(s=j)stu = Student()stu.__dict__ = dictprint('id: ' + stu.id + ' name: ' + stu.name + ' age: ' + str(stu.age) + ' sex: ' + str(stu.sex) + ' phone: ' + stu.phone + ' email: ' + stu.email) # id: 007 name: 007 age: 28 sex: male phone: 13000000000 email: 123@qq.comif __name__ == '__main__':json_to_obj()

json的load()与dump()方法的使用
dump()方法的使用

import jsondef dict_to_json_write_file():dict = {}dict['name'] = 'many'dict['age'] = 10dict['sex'] = 'male'print(dict) # {'name': 'many', 'age': 10, 'sex': 'male'}with open('1.json', 'w') as f:json.dump(dict, f) # 会在目录下生成一个1.json的文件,文件内容是dict数据转成的json数据if __name__ == '__main__':dict_to_json_write_file()load()的使用
import jsondef json_file_to_dict():with open('1.json', 'r') as f:dict = json.load(fp=f)print(dict) # {'name': 'many', 'age': 10, 'sex': 'male'}if __name__ == '__main__':json_file_to_dict()

 

0人点赞

 

spark mllib

 



作者:Helen_Cat
链接:https://www.jianshu.com/p/d28d33e52aaa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
author-avatar
CleanTheString
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有